package com.osfw.system.service.manage;

import com.baomidou.mybatisplus.extension.service.IService;
import com.osfw.framework.core.domain.Ztree;
import com.osfw.system.entity.manage.SysDept;
import com.osfw.system.entity.manage.SysMenu;
import com.osfw.system.entity.manage.SysRole;
import com.osfw.system.entity.manage.SysUser;

import java.util.List;

/**
 * 部门管理 服务层
 */
public interface ISysDeptService extends IService<SysDept> {
    /**
     * 查询组织机构内设部门信息
     *
     * @param deptId 组织机构内设部门信息ID
     * @return 组织机构内设部门信息
     */
    SysDept selectDeptById(Long deptId);

    /**
     * 查询部门管理数据
     *
     * @param dept 部门信息
     * @return 部门信息集合
     */
    List<SysDept> selectDeptList(SysDept dept);

    /**
     * 查询部门管理数据（直属下级部门）
     *
     * @param dept 部门信息
     * @param user 当前登录用户
     * @return 部门信息集合
     */
    List<SysDept> selectImmediateChildrenDeptList(SysDept dept, SysUser user);

    /**
     * 查询部门管理树
     *
     * @param dept 部门信息
     * @return 所有部门信息
     */
    List<Ztree> selectDeptTree(SysDept dept);

    /**
     * 查询部门管理树（带人数）
     *
     * @param dept 部门信息
     * @return 菜单列表
     */
    List<Ztree> selectDeptTreeWithCount(SysDept dept);

    /**
     * 查询部门管理树（直属下级）
     *
     * @param user 用户信息
     * @return 菜单列表
     */
    List<Ztree> deptTreeDataImmediateChild(SysUser user, SysDept dept);

    /**
     * 查询部门管理树（排除下级）
     *
     * @param dept 部门信息
     * @return 所有部门信息
     */
    List<Ztree> selectDeptTreeExcludeChild(SysDept dept);

    /**
     * 根据角色ID查询菜单
     *
     * @param role 角色对象
     * @return 菜单列表
     */
    List<Ztree> roleDeptTreeData(SysRole role);

    /**
     * 根据父部门ID查询下级部门数量
     *
     * @param parentId 父部门ID
     * @return 结果
     */
    int selectDeptCount(Long parentId);

    /**
     * 查询部门是否存在用户
     *
     * @param deptId 部门ID
     * @return 结果 true 存在 false 不存在
     */
    boolean checkDeptExistUser(Long deptId);

    /**
     * 删除部门管理信息
     *
     * @param deptId 部门ID
     * @return 结果
     */
    boolean deleteDeptById(Long deptId);

    /**
     * 新增保存部门信息
     *
     * @param dept 部门信息
     * @return 结果
     */
    boolean insertDept(SysDept dept);

    /**
     * 修改保存部门信息
     *
     * @param dept 部门信息
     * @return 结果
     */
    boolean updateDept(SysDept dept);

    /**
     * 根据ID查询所有子部门总数（正常状态）
     *
     * @param deptId 部门ID
     * @return 子部门数
     */
    long selectNormalChildrenDeptCountById(Long deptId);

    /**
     * 根据ID查询所有子部门ID（正常状态）
     *
     * @param deptId 部门ID
     * @return 子部门数
     */
    List<Long> selectNormalChildrenDeptIdById(Long deptId);

    /**
     * 根据ID查询所有子部门信息（正常状态）
     *
     * @param deptId 部门ID
     * @return 子部门数
     */
    List<SysDept> selectNormalChildrenDeptById(Long deptId);

    /**
     * 校验部门名称是否唯一
     *
     * @param dept 部门信息
     * @return 结果
     */
    String checkDeptNameUnique(SysDept dept);

    /**
     * 校验部门是否有数据权限
     *
     * @param deptId 部门id
     */
    void checkDeptDataScope(Long deptId);


    /**
     * 查询部门用户
     *
     * @param deptIds 部门ID
     * @param isLeader 是否仅查询直属领导（0-否，1-是）
     */
    List<SysUser> selectDeptUserByProc(List<Long> deptIds, Integer isLeader);
}
